#ifndef __CRC_H_
#define __CRC_H_
#include "stdint.h"
#include "stdbool.h"



typedef struct{
	uint8_t POLY ;//多项式 
	uint8_t INIT ;//初始值 
	uint8_t XOROUT ;//结果异或值 
	bool REFIN ;//输入数据是否反转 
	bool REFOUT ;//输出数据是否反转 
}CRC8_StructTypedef;

typedef struct{
	uint16_t POLY ;//多项式 
	uint16_t INIT ;//初始值 
	uint16_t XOROUT ;//结果异或值 
	bool REFIN ;//输入数据是否反转 
	bool REFOUT ;//输出数据是否反转 
}CRC16_StructTypedef;

typedef struct{
	uint32_t POLY ;//多项式 
	uint32_t INIT ;//初始值 
	uint32_t XOROUT ;//结果异或值 
	bool REFIN ;//输入数据是否反转 
	bool REFOUT ;//输出数据是否反转 
}CRC32_StructTypedef;

extern const CRC8_StructTypedef crc_8 				;
extern const CRC8_StructTypedef crc_8_ITU 			;
extern const CRC8_StructTypedef crc_8_ROHC 			;
extern const CRC8_StructTypedef crc_8_MAXIM 		;

extern const CRC16_StructTypedef crc_16_IBM 		;
extern const CRC16_StructTypedef crc_16_MAXIM 		;
extern const CRC16_StructTypedef crc_16_USB 		;
extern const CRC16_StructTypedef crc_16_MODBUS 		;
extern const CRC16_StructTypedef crc_16_CCITT 		;
extern const CRC16_StructTypedef crc_16_CCITT_FALSE	;
extern const CRC16_StructTypedef crc_16_X5 			;
extern const CRC16_StructTypedef crc_16_XMODEM 		;
extern const CRC16_StructTypedef crc_16_DNP 		;

extern const CRC32_StructTypedef crc_32 			;
extern const CRC32_StructTypedef crc_32_MPEG2 		;


uint8_t CRC8Check(const CRC8_StructTypedef* CRC_Struct, const uint8_t* data, size_t sizeOfData);
uint16_t CRC16Check(const CRC16_StructTypedef* CRC_Struct, const uint8_t* data,size_t sizeOfData);
uint32_t CRC32Check(const CRC32_StructTypedef* CRC_Struct, const uint8_t* data,size_t sizeOfData);
uint8_t crcCheck(const void* CRC_Struct, const uint8_t* data,size_t sizeOfData,void *rec_buf,size_t sizeOf_CRC_Struct);
#endif